package com.itany.corejava.util;

/**
 * @author MissChen
 * @version 1.0
 * @date 2023 年11月17日 13:56
 */

import java.util.Arrays;

/**
 * 定义一个数组的排序方法,根据实际传递的数组类型不同,排序的规则也不同
 *定义时只定义排序规则,不做具体实现。在调用时,使用匿名内部类进行具体的实现
 *例如:如果传递的是数字,则根据数值大小进行降序排序。如果传递的是字符串,则根据字符串长度进行升序排序
 *
 */
public class SortUtil {

    public static void main(String[] args) {
        Integer[] nums={12,6,7,8,13,4,8};
        SortUtil.sort(nums, new SortCompareInterface<Integer>() {
            @Override
            public int comparTo(Integer t1, Integer t2) {

                //升序
                // return t1-t2;

                //降序
                return t2-t1;
            }
        });
        System.out.println(Arrays.toString(nums));


        String[] names={"jack","tom","admin","abc","b","adsdsd"};
        SortUtil.sort(names, new SortCompareInterface<String>() {
            @Override
            public int comparTo(String t1, String t2) {

                //升序
                // return t1.length()-t2.length();

                // 降序
                return t2.length()-t1.length();
            }
        });
        System.out.println(Arrays.toString(names));


    }

    // 定义一个泛型方法，
    // 对于主体内部在该方法中进行实现
    // 对于比较大小的关键步骤：在调时通过匿名内部类进行实现
    // 对于数值：比较大小  t1-t2
    // 对于字符串:比较字符串的长度t1.length()-t2.length()

    public static <T> void sort(T[] arr,SortCompareInterface sc){
        for(int i=1;i<arr.length;i++){//外层循环控制比较的轮数
            for(int j=0;j<arr.length-i;j++){//内层循环控制每一轮比较的次数
               int result=sc.comparTo(arr[j],arr[j+1]);
               if(result>0){
                   //说明arr[j]>arr[j+1]
                   T temp=arr[j];
                   arr[j]=arr[j+1];
                   arr[j+1]=temp;
               }

            }
        }
    }
}
